<?php

/**
 * This is the model class for table "atividade".
 *
 * The followings are the available columns in table 'atividade':
 * @property integer $id_atividade
 * @property string $data
 * @property string $hora_conclusao
 * @property string $descricao
 * @property string $hora_alerta_proximidade
 * @property integer $tolerancia_atraso
 * @property string $email_responsavel_atividade
 * @property string $telefone_responsavel_atividade
 * @property string $outras_informacoes
 * @property integer $id_usuario
 * @property integer $id_instalacao
 * @property integer $concluida
 * 
 * The followings are the available model relations:
 * @property Usuario $Usuario
 * @property Instalacao $Instalacao
 * @property Anexo $Anexo
 */
class Atividade extends CActiveRecord {
    public $centro_de_operacao;
    public $orgao;
    public $hora_conclusao_min;
    public $hora_conclusao_max;

	/**
	 * Returns the static model of the specified AR class.
	 * @param string $className active record class name.
	 * @return Atividade the static model class
	 */
	public static function model($className=__CLASS__) {
        return parent::model($className);
	}

	/**
	 * @return string the associated database table name
	 */
	public function tableName() {
        return 'atividade';
	}

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules() {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            array('descricao', 'required', 'message' => 'Digite uma descrição válida'),
            array('data', 'required', 'message' => 'Selecione uma data válida'),
            array('data', 'date', 'format' => array('dd/MM/yyyy', 'yyyy-MM-dd'), 'message' => 'Selecione uma data no formato 00/00/0000 (dia/mês/ano)'),

            array('hora_conclusao', 'required', 'message' => 'Digite uma hora de conclusão válida'),
            array('hora_alerta_proximidade', 'required', 'message' => 'Digite uma hora de alerta de proximidade válida'),
            array('hora_conclusao, hora_alerta_proximidade', 'date', 'format' => array('hh:mm', 'h:m', 'hh:m', 'h:mm'), 'message' => 'Digite uma hora no formato 00:00 (horas de 00 a 23 e minutos de 00 a 59)'),
            array('hora_conclusao, hora_alerta_proximidade', 'match', 'pattern'=> '/^(0?[0-9]|1[0-9]|2[0-3]):(0?[0-9]|[1-5][0-9])$/', 'message' => 'Digite uma hora no formato 00:00 (horas de 00 a 23 e minutos de 00 a 59)'),

            array('tolerancia_atraso', 'required', 'message' => 'Digite uma tolerância de atraso válida'),
            array('tolerancia_atraso', 'numerical', 'integerOnly' => true, 'message' => 'Digite um valor inteiro para a tolerância de atraso (em minutos)'),
            array('tolerancia_atraso', 'numerical', 'min' => 1, 'tooSmall' => 'Digite um valor inteiro maior que 0 (zero) para a tolerância de atraso (em minutos)'),

            array('email_responsavel_atividade', 'required', 'message' => 'Digite o email do responsável pela atividade'),
            array('email_responsavel_atividade', 'email', 'message' => 'Digite um email válido'),

            array('telefone_responsavel_atividade', 'required', 'message' => 'Digite um telefone do responsável pela atividade válido'),
            array('telefone_responsavel_atividade', 'match', 'pattern'=> '/[(][0-9]{2}[)]\s?[0-9]{4,5}[-][0-9]{4,5}/', 'message' => 'Digite um telefone no formato (00) 0000-0000 ou (00) 00000-0000'),

            array('id_usuario', 'required', 'message' => 'Digite um identificador de usuário válido'),
            array('id_usuario', 'numerical', 'integerOnly' => true, 'message' => 'Digite um valor inteiro para o identificador de usuário'),

            array('id_instalacao', 'required', 'message' => 'Selecione um identificador de instalação válido'),
            array('id_instalacao', 'numerical', 'integerOnly' => true, 'message' => 'Selecione um valor inteiro para o identificador de instalação'),

            array('descricao, email_responsavel_atividade, outras_informacoes', 'length', 'max' => 128, 'message' => 'Digite uma informação com no máximo 128 caracteres'),
            array('telefone_responsavel_atividade', 'length', 'max' => 16, 'message' => 'Digite um telefone com no máximo 16 caracteres'),

            array('id_atividade, data, hora_conclusao, descricao, hora_alerta_proximidade, tolerancia_atraso, email_responsavel_atividade, telefone_responsavel_atividade, outras_informacoes, id_instalacao, id_usuario, centro_de_operacao, orgao, hora_conclusao_min, hora_conclusao_max', 'safe', 'on' => 'index'),
        );
	}

	/**
	 * @return array relational rules.
	 */
	public function relations() {
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
			'Usuario' => array(self::BELONGS_TO, 'Usuario', 'id_usuario'),
			'Instalacao' => array(self::BELONGS_TO, 'Instalacao', 'id_instalacao'),
            'Anexo' => array(self::HAS_MANY, 'Anexo', 'id_atividade'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels() {
		return array(
            'id_atividade' => 'Identificador de atividade',
            'data' => 'Data',
            'hora_conclusao' => 'Hora de conclusão',
            'descricao' => 'Descrição',
            'hora_alerta_proximidade' => 'Hora de alerta de proximidade',
            'tolerancia_atraso' => 'Tolerância de atraso (em minutos)',
            'email_responsavel_atividade' => 'E-mail do responsável pela atividade',
            'telefone_responsavel_atividade' => 'Telefone do responsável pela atividade',
            'outras_informacoes' => 'Outras Informações',
            'id_usuario' => 'Identificador de usuario',
            'id_instalacao' => 'Instalação',
            'concluida' => 'Concluída',
            'centro_de_operacao' => 'Centro de operação',
            'orgao' => 'Órgão',
            'anexos' => 'Arquivo(s) em anexo'
		);
	}

	/**
	 * Retrieves a list of models based on the current search/filter conditions.
	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
	 */
	public function getFilterDataProvider() {
        $criteria = new CDbCriteria;
        $criteria->with = array('Instalacao', 'Usuario');
		$criteria->compare('data', $this->data);

        //Add a BETWEEN condition to the search criteria
        $from = empty($this->hora_conclusao_min) ? "00" : $this->hora_conclusao_min;
        $to = empty($this->hora_conclusao_max) ? "24" : $this->hora_conclusao_max;
        $criteria->addBetweenCondition('hora_conclusao', $from . ':00', $to . ":00");

        $criteria->compare('descricao', $this->descricao, true);
		$criteria->compare('centro_de_operacao', $this->centro_de_operacao);
		$criteria->compare('orgao', $this->orgao);
		$criteria->compare('Instalacao.acronimo', $this->id_instalacao);
		$criteria->compare('concluida', ConclusionTypes::NOT_CONCLUDED);

		return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
            'pagination' => array('pageSize' => 15)
        ));
	}

    /**
     * Return boolean to compare two hours.
     * @param $attribute
     * @param $params
     * @return bool
     */
    public function dateCompare($attribute, $params) {
        list($hour_alert, $minute_alert) = explode(':', $this->hora_alerta_proximidade);
        list($hour_conclusion, $minute_conclusion) = explode(':', $this->hora_conclusao);

        if(intval($hour_conclusion) > intval($hour_alert) ||
            (intval($hour_conclusion) == intval($hour_alert) && intval($minute_conclusion) > intval($minute_alert)))
                return true;
        else
            $this->addError($attribute,
                ((!empty($params['message'])) ? $params['message'] : 'Digite uma hora de alerta de proximidade válida')
            );

        return false;
    }

    /**
     * Compare the current hour with registered hours and classify the activity
     * @return integer
     */
    private function getConclusionType() {
        $currentTime = date('H:i:s');
        $today = date('Y-m-d');
        $hour_conclusion_plus_tolerance = DateHelper::addMinutesToDate($this->hora_conclusao, $this->tolerancia_atraso);

        if($today == $this->data) {
            if($currentTime < $this->hora_alerta_proximidade)
                return ConclusionTypes::CONCLUDED_BEFORE_ALERT;

            else if($this->hora_alerta_proximidade <= $currentTime && $currentTime < $this->hora_conclusao)
                return ConclusionTypes::CONCLUDED_BEFORE_CONCLUSION;

            else if($this->hora_conclusao <= $currentTime && $currentTime < $hour_conclusion_plus_tolerance)
                return ConclusionTypes::CONCLUDED_BEFORE_TOLERANCE;

            else if($hour_conclusion_plus_tolerance <= $currentTime)
                return ConclusionTypes::CONCLUDED_AFTER_TOLERANCE;
        }

        return ($today < $this->data) ? ConclusionTypes::CONCLUDED_BEFORE_ALERT : ConclusionTypes::CONCLUDED_AFTER_TOLERANCE;
    }

    /**
     * Classify the activity about its conclusion
     */
    public function classifyActivityConcluded() {
        $this->concluida = $this->getConclusionType();
    }
}